package cn.qyd.threadsignal;

import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;

/**
 * @author 邱运铎
 * @date 2024-03-25 11:41
 */
public class ExchangerThreeDemo {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();

        new Thread(() -> {
            try {
                System.out.println("这是 Thread 1 ，得到了Thread ? 的数据： '" + exchanger.exchange("这是来自 Thread 1 的数据") + "'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"Thread 1").start();

        System.out.println("Thread 1 被阻塞");

        new Thread(() -> {
            try {
                //这里固定让后面三个线程等待到相同时间在运行，观察线程交换数据情况
                //发现到了指定时间后并发执行后线程之间数据交换似乎是随机的
                TimeUnit.SECONDS.sleep(2);
                System.out.println("这是 Thread 2 ，得到了Thread ? 的数据： '" + exchanger.exchange("这是来自 Thread 2 的数据") + "'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"Thread 2").start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("这是 Thread 3 ，得到了Thread ? 的数据： '" + exchanger.exchange("这是来自 Thread 3 的数据") + "'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"Thread 3").start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("这是 Thread 4 ，得到了Thread ? 的数据： '" + exchanger.exchange("这是来自 Thread 4 的数据") + "'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"Thread 4").start();
    }
}
